算法岗面经分享 | 字节跳动CV算法实习生面试(含超多知识点干货)
加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会与李开复老师等大牛群内互动!
同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。点击文末“阅读原文”立刻申请入群~
分享一篇字节跳动CV算法实习生面试经验帖,涉及较多视觉算法知识点分析,很有参考意义,希望对大家工作和求职有所帮助~
原文 | https://zhuanlan.zhihu.com/p/59270912
岗位信息如下:
一面(时间2019.3.14,形式是视频面试) -- 已凉
下午四点面试,晚上七点半收到了凉凉的邮件通知,不慌的,再接再励,查漏补缺,下面我就详细总结一下面试的经过。
注意:回答不一定正确,仅提供了我个人的回答,答案里有些不正确的地方,我之所以给出我的个人回答只是为了更好地还原面试过程,最近如有时间,我会整理出正确的答案。
注:我在下面的这篇文章中汇总了一些好文章,如果有需要的可以参考一下:
致谢:感谢各位朋友和各位大佬给出的宝贵意见
总结:根据各位朋友和各位大佬给出的宝贵意见,我反思总结如下:
python 和 c++基本语法不够扎实,需强化基本语法点,例如对python里面的集合set不太熟悉
回答过于简洁,难免给面试官基础知识不扎实的错觉,需讲得更详细
深度学习的基础知识不扎实,不系统化,需构建知识体系
面试建议:面试官主要是对着简历进行提问的,然后再扩展一下相关的知识点。面试主要考察了项目、比赛以及一些理论知识和编程语言的语法点。建议大家可以看着岗位信息进行简历的制作并且在简历上出现的内容需要好好准备一下。
下面就开始还原面试过程
1、简单自我介绍
2、kaggle "TGS Salt Identification Challeng"模型的准确度是怎么算的?
我说ap,然后面试官问有没有用miou,我说没有
TGS Salt Identification Challenge:https://www.kaggle.com/c/tgs-salt-identification-challenge#evaluation
3、说一下unet的结构
卷积,下采样,上采样,然后低层特征图和高层特征进行融合,最后进行分类
4、熟悉deeplab吗,aspp是怎样的
不太熟悉,目前正在阅读相应的论文和源码,我目前是对FCN,unet,refinenet,mask rcnn比较熟悉
5、说说 智能盘点—钢筋数量AI识别 这个比赛
这个比赛是实现拍照即可完成钢筋点根任务,先使用了YOLO,然后用了faster rcnn还有retinanet
智能盘点-钢筋数量AI识别 - DF,CCF大数据竞赛平台:https://www.datafountain.cn/competitions/332
6、retinanet的focal loss是解决的什么问题
解决类别不平衡问题,对困难样本的损失分配比较大的权重
既能调整正负样本的权重,又能控制难易分类样本的权重
7、那focal loss有解决背景样本和目标样本的问题吗
我说应该有
8、谈一下比赛中提到k-means算法
我说yolo是根据iou来进行距离度量的
https://github.com/AlexeyAB/darknet/blob/master/scripts/gen_anchors.py
9、那k-means是怎么实现的,k近邻算法呢
这个我用的是官方源码
估计面试官想问的是这个原理,K-Means聚类算法原理:https://www.cnblogs.com/pinard/p/6164214.html
10、opencv做了哪些数据增强
直方图,翻转,随机裁剪,高斯模糊,高斯噪声
11、怎么做的模型融合
如果是同个模型,会整合两个模型的检测结果,根据score来排序再做nms操作。
但这里我是用的不同模型,用的yolo和faster rcnn,他们的score没有太大的可比性,所以我没有用score来排序,我是求两个模型的交集,以解决误检的问题
12、为什么用交集,不用并集
其实这个我是根据提交结果来决定的,事实上,在这里交集的效果比并集好,交集解决误检问题,并集解决漏检问题
13、安检机物品检测的图片格式是怎么样的
x光扫描的RGB图
14、为什么选用yolo而不用unet
比较熟悉yolo
15、yolo是怎么分配检测框的
每个grid分配9个检测框
yolo会输出3种尺寸的特征图,13*13,26*26,52*52,每种尺寸特征图的每个grid预测3个框
16、yolo的预测框是什么值(x,y,w,h)
是相对grid的相对值
17、faster rcnn回归用的什么公式
我说欧式距离
18、熟悉smooth L1吗
描述了一下函数形式
19、说一下nms的操作
对每一类进行nms,先根据score进行降序排序,然后计算最高的score和其他框的iou,去掉iou大于阈值的检测框
https://github.com/rbgirshick/py-faster-rcnn/blob/master/lib/nms/py_cpu_nms.py
20、那假如一个类有1000个框,怎么计算iou和去掉大于阈值的框
先拿score最大的检测框和其余的检测框进行iou操作,这里用到了numpy数组的广播机制,然后用numpy的筛选操作,把大于一定阈值的检测框的score置0,然后下一次迭代从score不为0的检测框进行上述操作,直到操作完成
21、熟悉哪些基础网络
熟悉VGG、GoogleNet还有resnet这几个提取特征的,还有FPN这个来融合信息的
22、熟悉一些新的网络吗
不太熟悉,最近没关注,最近在研究代码
估计面试官想问的是这些网络Xception、DenseNet、DetNet,在文章开头的链接里汇总了
23、激活函数有哪些
sigmoid还有relu
还有tanh等
https://en.wikipedia.org/wiki/Activation_function
24、sigmoid存在什么问题
梯度消失
25、relu的表达式
我说成leaky relu的了,然后面试官说确定吗,不是relu的变形吗,
我说我说错了,然后我纠正了一下
26、relu的变体有哪些
learky relu
如何理解ReLU activation function?:https://www.zhihu.com/question/59031444/answer/177786603
请问人工神经网络中的activation function的作用具体是什么?为什么ReLu要好过于tanh和sigmoid function?:https://www.zhihu.com/question/29021768/answer/43488153
27、熟悉normalization吗
比较熟悉bn和gn
张俊林:深度学习中的Normalization模型:https://zhuanlan.zhihu.com/p/43200897
28、说说bn
bn是解决梯度消失问题的,通过bn能使数据在输入到激活函数之前回到导数较大的位置
#解决问题
解决内部数据分布不稳定问题
#做法
统计mini-batch个样本的期望和方差从而进行归一化,但这样会导致数据表达能力的缺失,所以要引入两个参数从而恢复数据本身的表达能力
#优势
使得网络中每层输入数据的分布相对稳定,加速模型学习速度
允许网络使用饱和性激活函数,缓解梯度消失问题
具有一定的正则化效果
29、bn是做了归一化吗
先做了归一化,例如先减去期望再除以方差,然后再乘以一个参数和加上一个参数,这两个参数是可学习的
30、bn是在哪一维进行操作的
在mini-batch和通道这两维,描述了一下具体是怎么算的。我举了个例子,四维tensor,分别是[n,c,h,w],然后bn是统计每张特征图的期望和方差,而这个期望和方差是n个样本同一张特征图的期望和方差
31、那gn有什么用
gn是解决bn对mini-batch过度依赖,gn是在通道处进行分组统计,不依赖mini-batch
32、bn和gn都在哪用
bn和gn我所了解的是在目标检测,当然图像分类也用到bn
33、c++和python是都熟悉吗
是的
34、那c++的指针和引用有什么区别
一个用的地址,一个是别名,但都能修改值
35、那引用能重新赋值吗
不能
36、静态变量有什么用
能不在实例化类的情况下进行调用,而且每个实例化后的对象共享这个值
37、静态变量在哪初始化,能在类内初始化吗
在类内类外都行
一般是在类外初始化,如需在类内初始化,要求该静态变量为静态字面值常量类型 C++ 静态成员的类内初始化 - WanChouchou - 博客园
38、静态函数有什么用
能在不实例化类的情况下进行调用
39、python有什么常用的数据类型
列表、无序字典和有序字典
列表、元组、字典、集合等
40、对多线程了解吗
了解,但没写过
41、那如果让你自己实现pytorch里面的dataloader,你怎么可以使它加载快点
用多线程
42、python的append和extend有什么区别
append是添加单个元素,extend是添加一个列表
python append 和 extend的区别:https://zhuanlan.zhihu.com/p/59334738
43、出一道算法题
算法题如下:给个有序数组,然后求元素平方后不重复的元素个数,例如[-10, -10, -5, 0, 1, 5, 8, 10]
我思想描述对了,然后面试官说有更好的方法吗,我想了一下说没有,然后面试官让我选个语言实现一下,选择了python来实现,用到了字典,然后面试官说用集合会不会更好,我说会的
# 这是我的实现,没有用到集合,如果用到集合会更好
data = [-10, -10, -5, 0, 1, 5, 8, 10]
new_list = []
for x in data:
temp = x*x
if temp not in new_list:
new_list.append(temp)
print(len(new_list))
# 这是群友给的代码,实在是太优秀了
print(len(set([x**2 for x in data])))
44、有什么问题想了解的吗
我说看岗位信息提到会进行技术的理论研究和技术的落地,如果我去了会负责什么,面试官说因为实习时间比较短,一般是做些技术落地的项目
45、那有师傅带吗,那一般做什么项目
有师傅带,一般做力所能及的项目
参考:
1、U-Net: Convolutional Networks for Biomedical Image Segmentation
2、Focal Loss for Dense Object Detection
3、YOLOv3: An Incremental Improvement
4、Fast R-CNN
5、Faster R-CNN Towards Real-Time Object Detection with Region Proposal Networks
6 、AlexeyAB/darknet:
https://github.com/AlexeyAB/darknet
7 rbgirshick/py-faster-rcnn:
https://github.com/rbgirshick/py-faster-rcnn
8 Rectifier (neural networks):
https://en.wikipedia.org/wiki/Rectifier_(neural_networks)
*延伸阅读
点击左下角“阅读原文”,即可申请加入极市目标跟踪、目标检测、工业检测、人脸方向、视觉竞赛等技术交流群,更有每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流,一起来让思想之光照的更远吧~
觉得有用麻烦给个在看啦~